<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
    </head>
    <body>
        <script>
            /*
            其实4和3类似，只不过3确定了只有两次，而4有k次
            确定dp数组和下标含义：dp[i][j]表示第i天状态为j的最大利润
            j为状态 0表示不操作，1表示第一次持有 2表示第一次不持有 3 表示第二次不持有
            因此j的范围为 j< 2*k+1

            状态转移方程
            dp[i][1]有两种操作，即i-1天依然持有，或者i-1天不持有，dp[i][1]=Math.max(dp[i-1][1],dp[i-1][0]-prices[i])
            dp[i][j]就需要根据奇偶推导
            for(let j=0;j<2*k-1;j+=2) j为上个状态 j+1为奇数天状态 j+2为偶数天状态  因为需要定义j+2作为偶数天，所以循环的时候自然j<2*k-1
            dp[i][j + 1] = Math.max(dp[i - 1][j + 1], dp[i - 1][j] - prices[i])
            dp[i][j + 2] = Math.max(dp[i - 1][j + 2], dp[i - 1][j + 1] + prices[i])
           
            */
            var maxProfit = function (k, prices) {
                let dp = new Array(prices.length).fill().map(() => new Array(2 * k + 1).fill(0))
                //当i==0，奇数j为-prices[0]
                for (let j = 1; j < 2 * k + 1; j += 2) {
                    dp[0][j] = -prices[0]
                }
                for (let i = 1; i < prices.length; i++) {
                    for (let j = 0; j < 2 * k; j += 2) {
                        //奇数
                        dp[i][j + 1] = Math.max(dp[i - 1][j + 1], dp[i - 1][j] - prices[i])
                        dp[i][j + 2] = Math.max(dp[i - 1][j + 2], dp[i - 1][j + 1] + prices[i])
                    }
                }
                return dp[dp.length - 1][2 * k]
            }
            maxProfit(2, [3, 2, 6, 5, 0, 3])
        </script>
    </body>
</html>
